﻿using KinonekoSoftware.ArkSpark.Documents;

namespace KinonekoSoftware.CodariaDB.Documents.Composes
{
    public sealed class Compose : DeltaObject, IDocument
    {
        private string _name;
        private string _intro;

        /// <summary>
        /// 获取或设置 <see cref="Intro"/> 属性。
        /// </summary>
        public string Intro
        {
            get => _intro;
            set => SetValue(ref _intro, value);
        }

        /// <summary>
        /// 获取或设置 <see cref="Name"/> 属性。
        /// </summary>
        public string Name
        {
            get => _name;
            set => SetValue(ref _name, value);
        }
        
        /// <summary>
        /// 判断元素是否存在于当前集合。
        /// </summary>
        /// <param name="element">指定要判断的元素。</param>
        /// <returns>返回结果，如果为true则表示存在，否则为false。</returns>
        public bool Contains(DocumentElement element)
        {
            if (element is null)
            {
                return false;
            }

            if (Elements is null)
            {
                return false;
            }
            
            return Elements.Any(x => x.Id == element.Id);
        }
        
        /// <summary>
        /// 判断元素在当前集合中的索引号。
        /// </summary>
        /// <param name="element">指定要判断的元素。</param>
        /// <returns>返回索引号，如果元素存在于当前集合则会返回>-1的索引号，否则不存在，会返回一个-1的值。</returns>
        public int IndexOf(DocumentElement element)
        {
            if (element is null)
            {
                return -1;
            }

            if (Elements is null)
            {
                return -1;
            }

            for (var i = 0; i < Elements.Count; i++)
            {
                var x = Elements[i];
                if (x.Id == element.Id)
                {
                    return i;
                }
            }
            
            return -1;
        }

        /// <summary>
        /// 所有元素的集合。
        /// </summary>
        public required List<DocumentElement> Elements { get; set; }
    }
}